#ifndef MAZE_GENERATOR_H
#define MAZE_GENERATOR_H

#include <vector>
#include <string>
#include <random>
#include <memory>
using namespace std;

// 迷宫元素枚举
enum class MazeElement {
    WALL = '#',      // 墙壁
    PATH = ' ',      // 通路
    START = 'S',     // 起点
    EXIT = 'E',      // 终点
    GOLD = 'G',      // 金币
    TRAP = 'T',      // 陷阱
    LOCKER = 'L',    // 机关
    BOSS = 'B'       // BOSS
};

// 位置结构体
struct Position {
    int x, y;
    Position(int x = 0, int y = 0) : x(x), y(y) {}
    
    bool operator==(const Position& other) const {
        return x == other.x && y == other.y;
    }
    
    bool operator<(const Position& other) const {
        if (x != other.x) return x < other.x;
        return y < other.y;
    }
};

// 游戏元素结构体
struct GameElement {
    Position pos;        // 位置
    MazeElement type;    // 元素类型
    int value;          // 资源值或陷阱伤害
    
    GameElement(Position p, MazeElement t, int v = 0) 
        : pos(p), type(t), value(v) {}
};

class MazeGenerator {
private:
    int size;               // 迷宫尺寸
    vector<vector<GameElement>> maze;  // 迷宫地图，每格都是GameElement
    Position startPos, endPos;  // 起点和终点位置
    
    // 随机数生成器
    mt19937 rng;
    
    // 记录门的行列位置，避免分割线经过
    vector<int> rows;  // 记录有门的行
    vector<int> cols;  // 记录有门的列
    
    // 分治递归生成迷宫
    void divideAndConquerRecursive(int x1, int y1, int x2, int y2);
    
    // 放置游戏元素
    void placeGameElements();
    
    // 检查位置是否有效
    bool isValidPosition(int x, int y) const;
    

public:

    // 构造函数
    MazeGenerator(int size = 15);
    
    // 生成迷宫（使用默认起点终点位置）
    void generateMaze();
    
    // 获取迷宫
    const vector<vector<GameElement>>& getMaze() const { return maze; }
    
    // 获取起点和终点
    Position getStartPosition() const { return startPos; }
    Position getEndPosition() const { return endPos; }
    
    // 打印迷宫
    void printMaze() const;
    
    // 保存为JSON格式
    void saveToJSON(const string& filename) const;
    
    // 保存为CSV格式
    void saveToCSV(const string& filename) const;
    
    // 设置随机种子
    void setSeed(unsigned int seed) { rng.seed(seed); }
    
    // 获取迷宫尺寸
    int getSize() const { return size; }
};

#endif // MAZE_GENERATOR_H